﻿/*****************************************************************//**
 * @file   VAOneXMLAdaptorSubsystemsShell.h
 * @brief  VAOne读写SEA板子系统适配器
 *
 * @author lilongyuan (lilongyuan@diso.cn)
 * @date   2025-02-10
 *********************************************************************/
#ifndef VAONEXMLADAPTORSUBSYSTEMSSHELL_H
#define VAONEXMLADAPTORSUBSYSTEMSSHELL_H

#include "FITKAbstractVAOneXMLAdaptor.h"

namespace Acoustics
{
    class FITKSEASubSysPlateShell;
    class FITKSEASubSysSinglyCurvedShell;
    class FITKSEASubSysDoublyCurvedShell;
    class FITKAbstractSEASubSysShell;
}

namespace IO
{
    /**
     * @brief   VAOne读写SEAShell适配器
     * @author  lilongyuan (lilongyuan@diso.cn)
     * @date    2025-02-10
     */
    class FITKVAOneXMLIOAPI VAOneXMLAdaptorSubsystemsShell : public FITKAbstractVAOneXMLAdaptor
    {
        FITKCLASS(IO, VAOneXMLAdaptorSubsystemsShell);
    public:
        /**
         * @brief   构造函数
         * @author  lilongyuan (lilongyuan@diso.cn)
         * @date    2025-02-10
         */
        explicit VAOneXMLAdaptorSubsystemsShell() = default;
        /**
         * @brief   析构函数
         * @author  lilongyuan (lilongyuan@diso.cn)
         * @date    2025-02-10
         */
        ~VAOneXMLAdaptorSubsystemsShell() = default;
        /**
         * @brief   适配器读数据
         * @return  是否执行成功
         * @author  lilongyuan (lilongyuan@diso.cn)
         * @date    2025-02-10
         */
        virtual bool adaptR() override;
        /**
         * @brief   适配器写数据
         * @return  是否执行成功
         * @author  lilongyuan (lilongyuan@diso.cn)
         * @date    2025-02-10
         */
        virtual bool adaptW() override;
    private:
        /**
         * @brief     读取SEA平板子系统数据
         * @param[i]  node FlatPlate节点，data SEA平板子系统数据对象
         * @return    是否执行成功
         * @author    lilongyuan (lilongyuan@diso.cn)
         * @date      2025-02-12
         */
        bool readFlatPlate(rapidxml::xml_node<char>* node, Acoustics::FITKSEASubSysPlateShell* data);
        /**
         * @brief     读取SEA单曲率板子系统数据
         * @param[i]  node SinglyCurvedShell节点，data SEA单曲率板子系统数据对象
         * @return    是否执行成功
         * @author    lilongyuan (lilongyuan@diso.cn)
         * @date      2025-02-12
         */
        bool readSinglyCurvedShell(rapidxml::xml_node<char>* node, Acoustics::FITKSEASubSysSinglyCurvedShell* data);
        /**
         * @brief     读取SEA双曲率板子系统数据
         * @param[i]  node DoublyCurvedShell节点，data SEA双曲率板子系统数据对象
         * @return    是否执行成功
         * @author    lilongyuan (lilongyuan@diso.cn)
         * @date      2025-02-12
         */
        bool readDoublyCurvedShell(rapidxml::xml_node<char>* node, Acoustics::FITKSEASubSysDoublyCurvedShell* data);
        /**
         * @brief     读取SEA板子系统共有属性数据
         * @param[i]  node 节点，data SEA板子系统数据对象
         * @return    是否执行成功
         * @author    lilongyuan (lilongyuan@diso.cn)
         * @date      2025-02-13
         */
        bool readShellCommonAttribute(rapidxml::xml_node<char>* node, Acoustics::FITKAbstractSEASubSysShell* data);
        /**
         * @brief     读取损耗因子频谱数据
         * @param[i]  node 节点，data SEA板子系统数据对象
         * @return    是否执行成功
         * @author    lilongyuan (lilongyuan@diso.cn)
         * @date      2025-02-13
         */
        bool readDamping(rapidxml::xml_node<char>* node, Acoustics::FITKAbstractSEASubSysShell* data);
        /**
         * @brief     读取损耗因子频谱启用状态数据
         * @param[i]  node 节点，data SEA板子系统数据对象
         * @return    是否执行成功
         * @author    lilongyuan (lilongyuan@diso.cn)
         * @date      2025-02-13
         */
        bool readDampingEnabled(rapidxml::xml_node<char>* node, Acoustics::FITKAbstractSEASubSysShell* data);
        /**
         * @brief     读取弯曲波数据
         * @param[i]  node 节点，data SEA板子系统数据对象
         * @return    是否执行成功
         * @author    lilongyuan (lilongyuan@diso.cn)
         * @date      2025-02-13
         */
        bool readFlexureWave(rapidxml::xml_node<char>* node, Acoustics::FITKAbstractSEASubSysShell* data);
        /**
         * @brief     读取SEA板子系统共有子节点数据
         * @param[i]  node 节点，data SEA板子系统数据对象
         * @return    是否执行成功
         * @author    lilongyuan (lilongyuan@diso.cn)
         * @date      2025-02-13
         */
        bool readShellCommonChildNode(rapidxml::xml_node<char>* node, Acoustics::FITKAbstractSEASubSysShell* data);
        /**
         * @brief     读取PlateWavefieldUD节点数据
         * @param[i]  node 节点，data SEA板子系统数据对象
         * @return    是否执行成功
         * @author    lilongyuan (lilongyuan@diso.cn)
         * @date      2025-02-13
         */
        bool readPlateWavefieldUD(rapidxml::xml_node<char>* node, Acoustics::FITKAbstractSEASubSysShell* data);
        /**
         * @brief     读取RadiationOptions节点数据
         * @param[i]  node 节点，data SEA板子系统数据对象
         * @return    是否执行成功
         * @author    lilongyuan (lilongyuan@diso.cn)
         * @date      2025-02-13
         */
        bool readRadiationOptions(rapidxml::xml_node<char>* node, Acoustics::FITKAbstractSEASubSysShell* data);
    private:
        /**
         * @brief     写出SEA平板子系统数据
         * @param[i]  node FlatPlate节点，data SEA平板子系统数据对象
         * @return    是否执行成功
         * @author    lilongyuan (lilongyuan@diso.cn)
         * @date      2025-02-12
         */
        bool writeFlatPlate(rapidxml::xml_node<char>* node, Acoustics::FITKSEASubSysPlateShell* data);
        /**
         * @brief     写出SEA单曲率板子系统数据
         * @param[i]  node SinglyCurvedShell节点，data SEA单曲率板子系统数据对象
         * @return    是否执行成功
         * @author    lilongyuan (lilongyuan@diso.cn)
         * @date      2025-02-12
         */
        bool writeSinglyCurvedShell(rapidxml::xml_node<char>* node, Acoustics::FITKSEASubSysSinglyCurvedShell* data);
        /**
         * @brief     写出SEA双曲率板子系统数据
         * @param[i]  node DoublyCurvedShell节点，data SEA双曲率板子系统数据对象
         * @return    是否执行成功
         * @author    lilongyuan (lilongyuan@diso.cn)
         * @date      2025-02-12
         */
        bool writeDoublyCurvedShell(rapidxml::xml_node<char>* node, Acoustics::FITKSEASubSysDoublyCurvedShell* data);
        /**
         * @brief     写出SEA板子系统共有属性数据
         * @param[i]  node 节点，data SEA板子系统数据对象
         * @return    是否执行成功
         * @author    lilongyuan (lilongyuan@diso.cn)
         * @date      2025-02-13
         */
        bool writeShellCommonAttribute(rapidxml::xml_node<char>* node, Acoustics::FITKAbstractSEASubSysShell* data);
        /**
         * @brief     写出损耗因子频谱数据
         * @param[i]  node 节点，data SEA板子系统数据对象
         * @return    是否执行成功
         * @author    lilongyuan (lilongyuan@diso.cn)
         * @date      2025-02-13
         */
        bool writeDamping(rapidxml::xml_node<char>* node, Acoustics::FITKAbstractSEASubSysShell* data);
        /**
         * @brief     写出损耗因子频谱启用状态数据
         * @param[i]  node 节点，data SEA板子系统数据对象
         * @return    是否执行成功
         * @author    lilongyuan (lilongyuan@diso.cn)
         * @date      2025-02-13
         */
        bool writeDampingEnabled(rapidxml::xml_node<char>* node, Acoustics::FITKAbstractSEASubSysShell* data);
        /**
         * @brief     写出弯曲波数据
         * @param[i]  node 节点，data SEA板子系统数据对象
         * @return    是否执行成功
         * @author    lilongyuan (lilongyuan@diso.cn)
         * @date      2025-02-13
         */
        bool writeFlexureWave(rapidxml::xml_node<char>* node, Acoustics::FITKAbstractSEASubSysShell* data);
        /**
         * @brief     写出SEA板子系统共有子节点数据
         * @param[i]  node 节点，data SEA板子系统数据对象
         * @return    是否执行成功
         * @author    lilongyuan (lilongyuan@diso.cn)
         * @date      2025-02-13
         */
        bool writeShellCommonChildNode(rapidxml::xml_node<char>* node, Acoustics::FITKAbstractSEASubSysShell* data);
        /**
         * @brief     写出PlatePositiveFace节点数据
         * @param[i]  node 节点，data SEA板子系统数据对象
         * @return    是否执行成功
         * @author    lilongyuan (lilongyuan@diso.cn)
         * @date      2025-02-13
         */
        bool writePlatePositiveFace(rapidxml::xml_node<char>* node, Acoustics::FITKAbstractSEASubSysShell* data);
        /**
         * @brief     写出PlateNegativeFace节点数据
         * @param[i]  node 节点，data SEA板子系统数据对象
         * @return    是否执行成功
         * @author    lilongyuan (lilongyuan@diso.cn)
         * @date      2025-02-13
         */
        bool writePlateNegativeFace(rapidxml::xml_node<char>* node, Acoustics::FITKAbstractSEASubSysShell* data);
        /**
         * @brief     写出PlateWavefieldUD节点数据
         * @param[i]  node 节点，data SEA板子系统数据对象
         * @return    是否执行成功
         * @author    lilongyuan (lilongyuan@diso.cn)
         * @date      2025-02-13
         */
        bool writePlateWavefieldUD(rapidxml::xml_node<char>* node, Acoustics::FITKAbstractSEASubSysShell* data);
        /**
         * @brief     写出RadiationOptions节点数据
         * @param[i]  node 节点，data SEA板子系统数据对象
         * @return    是否执行成功
         * @author    lilongyuan (lilongyuan@diso.cn)
         * @date      2025-02-13
         */
        bool writeRadiationOptions(rapidxml::xml_node<char>* node, Acoustics::FITKAbstractSEASubSysShell* data);
        /**
         * @brief     写出Baffling节点数据
         * @param[i]  node RadiationOptions节点，data SEA板子系统数据对象
         * @return    是否执行成功
         * @author    lilongyuan (lilongyuan@diso.cn)
         * @date      2025-02-13
         */
        bool writeBaffling(rapidxml::xml_node<char>* node, Acoustics::FITKAbstractSEASubSysShell* data);
        /**
         * @brief     写出BoundaryCondition节点数据
         * @param[i]  node RadiationOptions节点，data SEA板子系统数据对象
         * @return    是否执行成功
         * @author    lilongyuan (lilongyuan@diso.cn)
         * @date      2025-02-13
         */
        bool writeBoundaryCondition(rapidxml::xml_node<char>* node, Acoustics::FITKAbstractSEASubSysShell* data);
    private:
        /**
         * @brief     数据追加和数据更新模版
         * @param[i]  data SEA板子系统数据对象
         * @return    是否执行成功
         * @author    lilongyuan (lilongyuan@diso.cn)
         * @date      2025-02-12
         */
        template <typename T>
        bool dataAppendAndUpdate(T data)
        {
            // SEA板子系统数据
            if (data == nullptr) return false;

            // 追加SEA板子系统数据到SEA子系统管理器
            getSEASubSysManager()->appendDataObj(data);

            // 如果SEA板子系统数据中三角形列表无数据，需要更新三角网络，自动生成三角形网格
            if (data->getTriangleMesh()->getElementCount() == 0) data->updateTriMesh();

            // 更新几何属性
            data->updateGeoProp();

            return true;
        }
    };
    Register2FITKIOAdaptorFactory(VAOneXML, Shell, VAOneXMLAdaptorSubsystemsShell)
}

#endif // VAONEXMLADAPTORSUBSYSTEMSSHELL_H

